package com.dp.proxy.jdk_dynamic_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: Ruomeng
 * @Date: 2024/11/28
 * @Description : design-pattern
 * 代理工厂 -- 动态的生成代理对象
 * @Version: 1.0
 */
public class ProxyFactory {

    // 维护一个目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    // 为目标对象生成代理对象
    public Object getProxyInstance() {

        return Proxy.newProxyInstance(
                // 目标类使用的类加载器
                target.getClass().getClassLoader(),
                // 目标对象实现的接口类型
                target.getClass().getInterfaces(),
                // 事件处理器
                new InvocationHandler() {
                    /**
                     * @param proxy 代理对象
                     * @param method 对应于代理对象上调用的接口方法实例
                     * @param args 对应代理对象上调用的接口方法时 传递的参数
                     * @return 返回目标对象的方法的返回值，没有返回值就返回null
                     * @throws Throwable 异常
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("start");
                        method.invoke(target, args);
                        System.out.println("commit");
                        return null;
                    }
                }
        );
    }

}
